
#include "lireFichier.h"
#include <malloc.h>

FILE * fichierInit(const char * nomFichier)
{
	FILE * fic;
	fic = fopen(nomFichier, "r");
	if(fic == NULL)
	{
		printf("Erreur ouverture fichier %s\n", nomFichier);
		return NULL;
	}
	else
	{
		return fic;
	}
}

unsigned int nbrLigneFichier(FILE * fic)
{
	unsigned int nbrLigne = 0;
	int c;

	while((c = fgetc(fic)) != EOF) /*La boucle lit les caractÃ¨res du fichier un par un, jusqu'Ã  la fin du fichier (End Of File).*/
	{
		if(c == '\n') {++nbrLigne;}
	}

	rewind(fic);
	return nbrLigne;
}

char lireCaractere(FILE * texte, const int num)
{
	int i;
	char caractereActuel;
	rewind(texte);/*Repositionnement du curseur au début du fichier*/
	int t = nbrLigneFichier(texte);
    rewind(texte);
	if(num > t)
	{
		printf("Erreur : numÃ©ro de ligne trop grand");
		return 0;
	}
	for ( i=1 ; i<num ; i++ )/*Boucle qui saute les lignes prÃ©cedentes*/
	{
		do
        {
            caractereActuel = fgetc(texte); /*On lit le caractÃ¨re*/
        } while (caractereActuel != '\n');
	}
	do
    {
        caractereActuel = fgetc(texte); /*On lit le caractÃ¨re*/
        printf("%c", caractereActuel); /*On l'affiche*/
    } while (caractereActuel != '\n');
	return caractereActuel;
}

int posDebutLigne(FILE * fic, const int num)
{
    int i;
	char caractereActuel;
	rewind(fic);/*Repositionnement du curseur au dÃ©but du fichier*/
	int t = nbrLigneFichier(fic);
	rewind(fic);
	if(num > t)
	{
		printf("Erreur : numéro de ligne trop grand");
		return 0;
	}
	for ( i=1 ; i<num ; i++ )/*Boucle qui saute les lignes précedentes*/
	{
		do
        {
            caractereActuel = fgetc(fic); /*On lit le caractÃ¨re*/
        } while (caractereActuel != '\n');
	}
	return ftell(fic);/*Renvoie la position du curseur*/
}

int posFinLigne(FILE * fic, const int num)
{
    int i, t;
    long int K, J = -2;
	char caractereActuel;
	rewind(fic);/*Repositionnement du curseur au dÃ©but du fichier*/
	t = nbrLigneFichier(fic);
    rewind(fic);
	if(num > t)
	{
		printf("Erreur : numÃ©ro de ligne trop grand");
		return 0;
	}
	for ( i=0 ; i<num ; i++ )/*Boucle qui saute les lignes prÃ©cedentes*/
	{
		do
        {
            caractereActuel = fgetc(fic); /*On lit le caractÃ¨re*/
        } while (caractereActuel != '\n');
	}
	K = J +  ftell(fic);
	return K;

}

char caractereFichierNum(FILE * fic, const long int num)
{
    char caract;
    fseek(fic, num, SEEK_SET);
    caract = fgetc(fic);
    return caract;
}

void suppLigneVide(const char * nomFichier)
{
    FILE * fIn;
    FILE * fOut;
    char ligne[512];
    if ((fIn = fopen(nomFichier, "r")) == NULL)
    {
        printf("Impossible d'ouvrir le fichier");
    }
    else if ((fOut = fopen("texte.tmp", "w+")) == NULL)
    {
        fclose(fIn);
        printf("Impossible de creer le fichier temporaire");
    }
    else
    {
        while (fgets(ligne, 512, fIn))
        {
            if (ligne[0] != '\n')
            {
                fputs(ligne, fOut);
            }
        }
        fclose(fIn);
        fclose(fOut);
        rename("texte.tmp", nomFichier);
    }
}
void lireLigne(FILE * texte, const int num, char * ligne)
{
    int i, d, f;
	/**Repositionnement du curseur au debut du fichier*/
	rewind(texte);
	int t = nbrLigneFichier(texte);
    rewind(texte);
	if(num > t)
	{
		printf("Erreur : numero de ligne trop grand");
	}
	else
	{
        d = posDebutLigne(texte,num);
        f = posFinLigne(texte,num);
        for( i=d ; i<=f ; i++)
        {
            ligne[i-d] = caractereFichierNum(texte, i);
        }
        ligne[f-d+1] = '\0';
	}
}

void lireFichTestRegression()
{
    long int posD, posF, i;
    char X;
	char * ligne;
	/**Emplacement du fichier*/
    char * fichier = "./doc/testRegrLireFichier.txt";
    printf("** Test regression : ouverture fichier **\n");

    /**Créé un type fichier et l'initialise*/
    FILE *fic = fichierInit(fichier);
    assert(fic != NULL);
    printf("* Ouverture fichier : okay! *\n");

    /**On supprime les lignes vides*/
    suppLigneVide(fichier);

    /**On initialise les positions des curseurs de début et de fin*/
    posD = posDebutLigne(fic,1);
    posF = posFinLigne(fic,2);

    /**Afficher caractère par caractère*/
    for( i=posD ; i<=posF ; i++)
    {
        X = caractereFichierNum(fic, i);
        printf("%c", X);
    }
    printf("\n");

    /**On créé et alloue de la mémoire pour ligne*/
    ligne = malloc(64 * sizeof(char));
    /**On récupère la en chaine de caractère la ligne 1*/
    lireLigne(fic,3,ligne);
    /**Puis on l'affiche*/
    printf("%s\n", ligne);

    /**Libération de la mémoire alloué*/
    free(ligne);
    fclose(fic);

    printf("* Test regression lireFicher : okay! *\n\n");
}
